<?php
/**
 * Created by PhpStorm.
 * User: wumengmeng <wu_mengmeng@foxmail.com>
 * Date: 2019/4/25 0025
 * Time: 17:46
 */


/**
 * 获取公共配置
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function common_config(){
    $arr_data = [
      'with'=>[],//默认关联
      'where'=>[],//默认查询条件
      'field'=>['*'],//默认查询字段
      'order'=>['key'=>'id','value'=>'desc'],//默认排序方式
      'n_per_page'=>15,//默认每页查询条数
      'api_take_num'=>10,//接口查询数量
      'withCount'=>[],//默认关联统计

    ];
    return $arr_data;
}

/**
 * api接口取出数据条数
 *
 * @return mixed
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function api_take_num(){
    return common_config()['api_take_num'];
}

////////////////////////// 清除模块 start

/**
 * 根据类型清除缓存
 *
 * @param string $type
 *
 * @return bool
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function clear_operate_by_type(string $type)
{
    switch ($type)
    {
        case 'view':
            Artisan::call('view:clear');
            return true;
            break;
        case 'route':
            Artisan::call('route:clear');
            return true;
            break;
        case 'cache':
            Artisan::call('cache:clear');
            return true;
            break;
        case 'config':
            Artisan::call('config:clear');
            return true;
            break;
        case 'menu':
            Cache::forget('menus:' . admin_user_id());
            return true;
            break;
        default:
            return false;
    }
}

/**
 * 清除各类缓存操作
 *
 * @param array $arrInput
 *
 * @return array|\Illuminate\Http\RedirectResponse
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function clear_cache_operate(array $arrInput)
{
    $arrData = $arrInput['clear'];
    foreach ($arrData as $value)
    {
        $res = clear_operate_by_type($value);
        if($res === false) {
            return ['state'=>1,'msg'=>'操作失败','data'=>[],'error'=>''];
        }
    }
    return ['state'=>0,'msg'=>'清除成功','data'=>[],'error'=>''];
}

/**
 * 清除session
 *
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function session_clear()
{
    //清除全部session
    \Illuminate\Support\Facades\Session::flush();
}

////////////////////////// 清除模块 end


////////////////////////// redis 模块 start

/**
 * redis连接
 *
 * @param int $n_db
 *
 * @return \Predis\Client
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function predis_connection($n_db = 0){
    //    ini_set('default_socket_timeout', -1);
    $n_env_db = env('REDIS_DB',0);
    $n_db = $n_db + $n_env_db;
    $server = [
      'host'     => env('REDIS_HOST','127.0.0.1'),
      'password'     => env('REDIS_PASSWORD',null),
      'port'     => env('REDIS_PORT',6379),
      'database' => $n_db
    ];
    $client = new Predis\Client($server);
    return $client;
}

/**
 * redis存字符串
 *
 * @param     $key
 * @param     $value
 * @param int $time
 * @param int $db
 *
 * @return int
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function predis_str_set($key, $value, $time = 0, $db = 0)
{
    $redis = predis_connection($db);
    $value = json_encode($value);

    if($time === 0) {
        //永久存储
        $re = $redis->set($key, $value);
    }
    else {
        //临时存储-有效期
        $re = $redis->setex($key, $time, $value);
    }
    $redis->disconnect();
    return $re;
}

/**
 * redis取字符串
 *
 * @param     $key
 * @param int $db
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function predis_str_get($key, $db = 0)
{
    $redis = predis_connection($db);
    $re = $redis->get($key);
    $re = json_decode($re,true);
    $redis->disconnect();
    return $re;
}

/**
 * redis删除字符串
 *
 * @param     $key
 * @param int $db
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function predis_str_del($key, $db = 0)
{
    $redis = predis_connection($db);
    $re = $redis->del($key);
    $redis->disconnect();
    return $re;
}

/************* redis-Hash表操作 *************/

/**
 * redis 存入hash字段
 *
 * @param     $table
 * @param     $key
 * @param     $value
 * @param int $db
 *
 * @return int
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function predis_hash_set($table,$key,$value, $db = 0){
    $table = 'hash_'.$table;
    $value = json_encode($value);
    $redis = predis_connection($db);
    $result = $redis->hset($table,$key,$value);
    $redis->disconnect();
    return $result;
}

/**
 * redis 存入hash字段-字段累加
 *
 * @param     $table
 * @param     $key
 * @param     $step
 * @param int $db
 *
 * @return int
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function predis_hash_key_increment($table,$key,$step, $db = 0){
    $table = 'hash_'.$table;
    $redis = predis_connection($db);
    $result = $redis->hincrby($table,$key,$step);
    $redis->disconnect();
    return $result;
}

/**
 * redis 存入hash字段-字段递减
 *
 * @param     $table
 * @param     $key
 * @param     $step
 * @param int $db
 *
 * @return int
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function predis_hash_key_decrement($table,$key,$step, $db = 0){
    $table = 'hash_'.$table;
    $redis = predis_connection($db);
    $result = $redis->hincrby($table,$key,-$step);
    $redis->disconnect();
    return $result;
}

/**
 * redis 取出hash字段
 *
 * @param     $table
 * @param     $key
 * @param int $db
 *
 * @return mixed|string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function predis_hash_get($table,$key, $db = 0){
    $table = 'hash_'.$table;
    $redis = predis_connection($db);
    $result = $redis->hget($table,$key);
    $result = json_decode($result,true);
    $redis->disconnect();
    return $result;
}

/**
 * redis 删除hash字段
 *
 * @param     $table
 * @param     $key
 * @param int $db
 *
 * @return int
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function predis_hash_del($table,$key, $db = 0){
    $table = 'hash_'.$table;
    $redis = predis_connection($db);
    $result = $redis->hdel($table,$key);
    $redis->disconnect();
    return $result;
}

/**
 * redis 删除整个hash表
 *
 * @param     $table
 * @param int $db
 *
 * @return int
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function predis_hash_del_all($table,$db = 0){
    $table = 'hash_'.$table;
    $redis = predis_connection($db);
    $result = $redis->del($table);
    $redis->disconnect();
    return $result;
}

/************* redis-队列操作 *************/
function predis_queue_connection(){
    $db = 2;
    $redis = predis_connection($db);
    return $redis;
}
/*redis 队列 左侧插入数据*/
function predis_queue_lpush($table,$value){
    $table = 'queue_'.$table;
    $redis = predis_queue_connection();
    $result = $redis->lpush($table,$value);
    $redis->disconnect();
    return $result;
}

/*redis 队列 左侧取出数据-取出一条并删除*/
function predis_queue_lpop($table){
    $table = 'queue_'.$table;
    $redis = predis_queue_connection();
    $result = $redis->lpop($table);
    $redis->disconnect();
    return $result;
}

/*redis 队列 左侧取出指定数量数据-取出多条不删除*/
function predis_queue_lrange($table,$num = 1){
    $table = 'queue_'.$table;
    $redis = predis_queue_connection();
    $result = $redis->lrange($table,0,$num);
    $redis->disconnect();
    return $result;
}


/*redis 队列 右侧插入数据*/
function predis_queue_rpush($table,$value){
    $table = 'queue_'.$table;
    $redis = predis_queue_connection();
    $result = $redis->rpush($table,$value);
    $redis->disconnect();
    return $result;
}

/*redis 队列 右侧取出数据-取出一条并删除*/
function predis_queue_rpop($table){
    $table = 'queue_'.$table;
    $redis = predis_queue_connection();
    $result = $redis->rpop($table);
    $redis->disconnect();
    return $result;
}


/*redis 队列 插入数据 默认模式是【右进左出】*/
function predis_queue_in($table,$value){
    $result = predis_queue_rpush($table,$value);
    return $result;
}

/*redis 队列 取出数据 默认模式是【右进左出】*/
function predis_queue_out($table,$num = 1){
    $arr_data = [];
    for ($i = 0;$i < $num;$i++){
        $result = predis_queue_lpop($table);
        if(!is_null($result)){
            $arr_data[] = json_decode($result,true);
        }
    }
    return $arr_data;
}

function queue_in($table,$data){
    $json_data = json_encode($data);
    $result = predis_queue_in($table,$json_data);
    return $result;
}

function queue_out($table,$num = 10){
    $result = predis_queue_out($table,$num);
    return $result;
}











/**
 * redis连接
 *
 * @param int $n_db
 *
 * @return \Predis\Client
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function connection_redis($n_db = 0)
{
    //    ini_set('default_socket_timeout', -1);
    $server = [
      'host'     => env('REDIS_HOST','127.0.0.1'),
      'password'     => env('REDIS_PASSWORD',null),
      'port'     => env('REDIS_PORT',6379),
      'database' => $n_db
    ];
    $client = new Predis\Client($server);
    return $client;
}

/**
 * redis存字符串
 *
 * @param     $key
 * @param     $value
 * @param int $time
 * @param int $db
 *
 * @return int
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function redis_string_set($key, $value, $time = 0, $db = 0)
{
    $redis = connection_redis($db);
    $value = json_encode($value);
    if($time === 0) {
        //永久存储
        $re = $redis->set($key, $value);
    }
    else {
        //临时存储-有效期
        $re = $redis->setex($key, $time, $value);
    }
    $redis->disconnect();
    return $re;
}

/**
 * redis取字符串
 *
 * @param     $key
 * @param int $db
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function redis_string_get($key, $db = 0)
{
    $redis = connection_redis($db);
    $re = $redis->get($key);
    $re = json_decode($re);
    $redis->disconnect();
    return $re;
}

/**
 * redis删除字符串
 *
 * @param     $key
 * @param int $db
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function redis_string_del($key, $db = 0)
{
    $redis = connection_redis($db);
    $re = $redis->del($key);
    $redis->disconnect();
    return $re;
}


////////////////////////// redis 模块 end



////////////////////////// 用户信息 模块 start

/**
 * 登录认证guard
 *
 * @param string $s_model
 *
 * @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard|mixed
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function guard(string $s_model = '')
{
    return \Illuminate\Support\Facades\Auth::guard($s_model);
}

/**
 * 获取用户信息
 *
 * @param string $sModules
 *
 * @return \Illuminate\Contracts\Auth\Authenticatable|null
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function user(string $sModules = '')
{
    return guard($sModules)->user();
}

/**
 * 用户id
 *
 * @param string $sModules
 *
 * @return int|string|null
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function user_id(string $sModules = '')
{
    return guard($sModules)->id();
}

/**
 * 注销用户
 *
 * @param string $sModules
 *
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function offset_user(string $sModules = '')
{
    guard($sModules)->logout();
    session_clear();
}

////////////////////////// 用户信息 模块 end


////////////////////////// 手机验证码 模块 start

/**
 * 发送验证码
 *
 * @param int    $mobile    手机号
 * @param int    $code      验证码
 * @param string $s_type    短信业务服务商
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function send_code( $mobile,int $code,$s_type = 'cr_cloud')
{
    switch ($s_type)
    {
        case 'ihuyi':

            /* 互亿无线 */
            $arr_gets = send_code_by_ihuyi($mobile,$code);
            if($arr_gets['SubmitResult']['code'] == 2){
                $res = ['state'=>0,'msg'=>'发送成功','data'=>[],'error'=>''];
            }
            else{
                $res = ['state'=>1,'msg'=>$arr_gets['SubmitResult']['msg'],'data'=>[],'error'=>''];
            }
            break;

        case 'cr_cloud':

            /* 创瑞云 */
            $re = send_code_by_cr_cloud($mobile,$code);
            if($re['code'] == 0) {
                $res = ['state'=>0,'msg'=>'发送成功','data'=>[],'error'=>''];
            }
            else {
                $res = ['state'=>1,'msg'=>$re['msg'],'data'=>[],'error'=>''];
            }
            break;
        default:
            return [];
    }

    return $res;

}

/**
 * 发送验证码-创瑞云
 *
 * @param int    $mobile    手机号
 * @param int    $code      验证码
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function send_code_by_cr_cloud( $mobile,int $code)
{
    /* 创瑞云 */
    $config['cr_cloud_accesskey'] = config('system.sms.cr_cloud.cr_cloud_accesskey',0);
    $config['cr_cloud_secret'] = config('system.sms.cr_cloud.cr_cloud_secret',0);
    $config['cr_cloud_sign_id'] = 136169;  //32243
    $config['cr_cloud_template_id'] = 49244;
    $post_data = "accesskey=".$config['cr_cloud_accesskey'].
      "&secret=".$config['cr_cloud_secret'].
      "&sign=".$config['cr_cloud_sign_id'].
      "&templateId=".$config['cr_cloud_template_id'].
      "&mobile=".$mobile.
      "&content=". rawurlencode($code);
    $target = "http://api.1cloudsp.com/api/v2/single_send";
    $re = curl_post( $target, $post_data);
    $re = json_decode($re,true);
    return $re;
}

/**
 * 发送验证码-互亿无线
 *
 * @param int    $mobile    手机号
 * @param int    $code      验证码
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function send_code_by_ihuyi( $mobile,int $code)
{
    $config['ihuyi_account'] = config('system.sms.ihuyi.ihuyi_account',0);
    $config['ihuyi_ps'] = config('system.sms.ihuyi.ihuyi_ps',0);

    $target = "http://106.ihuyi.cn/webservice/sms.php?method=Submit";

    $post_data = "account=".$config['ihuyi_account']."&password=".$config['ihuyi_ps']."&mobile=".$mobile."&content=".rawurlencode("您的验证码是：".$code."。请不要把验证码泄露给其他人。");

    //密码可以使用明文密码或使用32位MD5加密
    $arr_gets = xml_to_array(curl_post($target ,$post_data));
    return $arr_gets;
}

/**
 * 发送手机号验证码-单个手机号
 *
 * @param $s_phone
 *
 * @return array
 * @throws \Exception
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function send_phone_code($s_phone)
{
    //查询短信剩余数量
    $n_remain_num = intval(duanxin_num_get());
    if($n_remain_num <= 0){
        return hello_error('短信接口欠费');
    }

    $s_phone = str_trim($s_phone);
    $n_phone_length = strlen($s_phone);
    if($n_phone_length <= 0){
        return ['state'=>1,'msg'=>'手机号不能为空','data'=>[],'error'=>''];
    }
    if($n_phone_length != 11){
        return ['state'=>1,'msg'=>'请输入11位手机号','data'=>[],'error'=>''];
    }
    $res = preg_phone($s_phone);
    if($res['state'] != 0){
        return $res;
    }
//    $s_phone = (int)$s_phone;
    $n_code = random_int(100000,999999);//生成验证码
    $result = send_code($s_phone,$n_code);
    if($result['state'] === 0){
        $s_key  = redis_key_phone_code($s_phone);//创建redis验证码存储key
        redis_string_set($s_key,$n_code,5 * 60,5);

        //扣除短信数量
        duanxin_num_deduct();

        //TODO 正式上线时把数据返回的验证码去掉
//        return ['state'=>0,'msg'=>'发送成功','data'=>['code'=>$n_code],'error'=>''];
        return ['state'=>0,'msg'=>'发送成功','data'=>[],'error'=>''];
    }
    return $result;
}

/**
 * 生成手机验证码redis key值
 *
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 *
 * @param $s_phone
 *
 * @return mixed
 */
function redis_key_phone_code($s_phone)
{
    return 'YZM_phone_code_'.$s_phone;
}

/**
 * 获取redis里的手机验证码
 *
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 *
 * @param $s_phone
 *
 * @return mixed
 */
function redis_phone_code($s_phone)
{
    return redis_string_get(redis_key_phone_code($s_phone),5);
}

/**
 * 销毁redis里的手机验证码
 *
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 *
 * @param $s_phone
 *
 * @return mixed
 */
function unset_redis_phone_code($s_phone)
{
    return redis_string_del(redis_key_phone_code($s_phone),5);
}

/**
 * 验证手机验证码
 *
 * @param $s_phone
 * @param $code
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function check_phone_code($s_phone,$s_code)
{
    //获取redis存储的手机验证码
    $s_real_code = redis_phone_code( $s_phone );

    //查询手机验证码发送记录
    $s_date = time_to_ymdhis(time() - 30*60);
    $arr_where = ['phone'=>$s_phone];
    $n_count = HiCommon\MongodbModel\MongoPhoneCodeLog::where($arr_where)->where('send_at','>=',$s_date)->count();
    if($n_count <= 0){
        return hello_error('请发送验证码');
    }
    if (empty($s_real_code)){
        return hello_error('验证码已过期');
    }
    if ($s_real_code != $s_code){
        return hello_error('验证码错误');
    }
    return ['state'=>0,'msg'=>'验证成功','data'=>[],'error'=>''];

}

////////////////////////// 手机验证码 模块 end


////////////////////////// 其他 模块 start

/**
 * curl get提交数据发送请求
 *
 * @param $curlPost
 * @param $url
 *
 * @return bool|string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function curl_request($url = '',$arr_option = [])
{
    $curl = curl_init();
    //    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($curl, CURLOPT_URL, $url);//需要获取的URL地址，也可以在PHP的curl_init()函数中设置
    if(isset($arr_option['header'])){
        $headers = $arr_option['header'];
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);//设置一个header中传输内容的数组。
    }
    curl_setopt($curl, CURLOPT_FAILONERROR, false);//显示HTTP状态码，默认行为是忽略编号小于等于400的HTTP信息
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//设定是否显示头信息
    //    curl_setopt($curl, CURLOPT_HEADER, true);//启用时会将头文件的信息作为数据流输出。

    /*最后发现自己调用的api的接口地址是ssl协议的，然后加上下面两个就可以了 - 即https*/
    if (1 == strpos("$".$url, "https://")) {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    }

    $result = curl_exec($curl);
    curl_close($curl);
    return $result;
}


/**
 * curl get提交数据发送请求
 *
 * @param $curlPost
 * @param $url
 *
 * @return bool|string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function curl_get($url = '',$arr_option = [])
{
    $curl = curl_init();
    //    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($curl, CURLOPT_URL, $url);//需要获取的URL地址，也可以在PHP的curl_init()函数中设置
    if(isset($arr_option['header'])){
        $headers = $arr_option['header'];
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);//设置一个header中传输内容的数组。
    }
    curl_setopt($curl, CURLOPT_FAILONERROR, false);//显示HTTP状态码，默认行为是忽略编号小于等于400的HTTP信息
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//设定是否显示头信息
//    curl_setopt($curl, CURLOPT_HEADER, true);//启用时会将头文件的信息作为数据流输出。

    /*最后发现自己调用的api的接口地址是ssl协议的，然后加上下面两个就可以了 - 即https*/
    if (1 == strpos("$".$url, "https://")) {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    }

    $result = curl_exec($curl);
    curl_close($curl);
    return $result;
}

/**
 * curl get提交数据发送请求
 *
 * @param $curlPost
 * @param $url
 *
 * @return bool|string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function curl_request_post($url = '',$data = '',$arr_option = [])
{
    $curl = curl_init();
//    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($curl, CURLOPT_POST,true); //设置POST请求

    curl_setopt($curl, CURLOPT_URL, $url);
    if(isset($arr_option['header'])){
        $headers = $arr_option['header'];
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);//设置一个header中传输内容的数组。
    }
    curl_setopt($curl, CURLOPT_FAILONERROR, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_NOBODY, true);

    /*最后发现自己调用的api的接口地址是ssl协议的，然后加上下面两个就可以了*/
    if (1 == strpos("$".$url, "https://")) {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);// 信任任何证书
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    }
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    curl_setopt($curl, CURLOPT_TIMEOUT,(int)40);
    $result = curl_exec($curl);
    curl_close($curl);
    return $result;
}

/**
 * curl post提交数据发送请求
 *
 * @param string $url
 * @param string $post_data
 * @param array  $headers
 *
 * @return bool|string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function curl_post($url = '',$post_data = '', $headers = [])
{
    if (empty($url) || empty($post_data)) {
        return false;
    }

    $curl = curl_init();
    curl_setopt($curl,CURLOPT_URL,$url);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_NOBODY, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);

    /*最后发现自己调用的api的接口地址是ssl协议的，然后加上下面两个就可以了*/
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

    curl_setopt($curl, CURLOPT_POST,true); //设置POST请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($curl, CURLOPT_TIMEOUT,(int)40);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); //添加httpheader

    $return_str = curl_exec($curl);
    curl_close($curl);
    return $return_str;
}

function curl_data_to_url_data($s_url,$arr_data){
    $s_data = '';
    foreach ($arr_data as $key=>$value)
    {
        $s_data .= $key.'='.$value.'&';
    }
    $s_data = trim($s_data,'&');

    $url = $s_url.'?'.$s_data;
    return $url;

}

/**
 * xml转数组
 *
 * @param $xml
 *
 * @return mixed
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function xml_to_array($xml)
{
    $reg = "/<(\w+)[^>]*>([\\x00-\\xFF]*)<\\/\\1>/";
    if(preg_match_all($reg,$xml,$matches)){
        $count = count($matches[0]);
        for($i = 0; $i < $count; $i++){
            $subxml = $matches[2][$i];
            $key    = $matches[1][$i];
            if(preg_match($reg,$subxml)){
                $arr[$key] = xml_to_array($subxml);
            }
            else{
                $arr[$key] = $subxml;
            }
        }
    }
    return $arr;
}

/**
 * 隐藏手机号中间几位数字并用*代替 [延伸] 可对任何字段的指定位置字段进行隐藏
 *
 * @param        $s_phone
 * @param string $s_hide
 * @param int    $n_start
 * @param int    $n_length
 *
 * @return mixed
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function hide_phone($s_phone,$s_hide = '****',$n_start = 3,$n_length = 4)
{
    $n_end_start = $n_start + $n_length;
    $res = substr($s_phone, 0, $n_start).$s_hide.substr($s_phone, $n_end_start);
//    $s_string = substr($s_phone,$n_start,$n_length);  //获取手机号中间四位
//    $res = str_replace($s_string,$s_hide,$s_phone);  //用****进行替换
    return $res;
}

function cut_string($s_string,$s_hide = '',$n_start = 0,$n_length = 1)
{
    $n_end_start = $n_start + $n_length;
    $res = substr($s_string, 0, $n_start).$s_hide.substr($s_string, $n_end_start);
    return $res;
}

/**
 * 列表数组转换成键值对的一维数组
 *
 * @param array  $arr_list
 * @param string $s_value
 * @param string $s_key
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function list_array_to_key_value($arr_list = [],$s_value = 'name',$s_key = 'id')
{
    $arr_data = [];
    foreach ($arr_list as $value)
    {
        $arr_data[$value[$s_key]] = $value[$s_value];
    }
    return $arr_data;
}

/**
 * 将二维列表数组里的某个key对应的value拿出来，放到一维索引数组里
 *
 * @param array  $arr_list
 * @param string $s_value_key
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function arr_value_to_ids($arr_list = [],$s_value_key = 'name'){
    $arr_data = [];
    foreach ($arr_list as $value)
    {
        $arr_data[$value[$s_value_key]] = $value[$s_value_key];
    }
    $arr_data = array_values($arr_data);
    return $arr_data;
}

/**
 * 一维数组键变成值
 *
 * @param array  $arr_list
 * @param string $s_value
 * @param string $s_key
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function arr_value_to_key($arr_list = [])
{
    $arr_data = [];
    foreach ($arr_list as $key=>$value)
    {
        $arr_data[] = $key;
    }
    return $arr_data;
}


/**
 * id集合数组转为标识分隔的字符串
 *
 * @param array  $arrIds
 * @param string $s_expend
 * @param string $s_mark
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function ids_arr_to_string($arrIds = [],$s_expend = '',$s_mark = ',')
{
    $res = '';
    if(is_array($arrIds) && count($arrIds) > 0) {
        foreach ($arrIds as $value) {
            $s_full_field = $s_expend.$value;

            if($res === '') {
                $res = $s_full_field;
            }
            else {
                $res .= $s_mark.$s_full_field;
            }
        }
    }
    return $res;
}

/**
 * id标识分隔的字符串转为id集合数组
 *
 * @param string $s_Ids
 * @param string $s_expend
 * @param string $s_mark
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function ids_string_to_arr($s_Ids = '',$s_expend = '',$s_mark = ',')
{
    $res = [];
    if(!empty($s_Ids)) {
        $s_Ids = str_replace($s_expend,'',$s_Ids);
        $res = explode($s_mark,$s_Ids);
    }
    return $res;
}

/**
 * 一维数组转为二维数组，同时给子数组添加特定索引
 *
 * @param array  $arr 一维数组
 * @param string $s_expend 特定字符
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function arr_one_to_two($arr = [],$s_expend = 'id',$arr_option = [])
{
    $arr_data = [];
    foreach ($arr as $key=>$value) {
        $arr_data[] = [$s_expend=>$value]+$arr_option;
    }
    return $arr_data;
}

/**
 * 一维数组每个value值加上特定的字符
 *
 * @param array  $arr 一维数组
 * @param string $s_expend 特定字符
 * @param string $s_location pre前 end后
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function arr_value_add_string($arr = [],$s_expend = '',$s_location = 'pre')
{
    if($s_location === 'pre')
    {
        foreach ($arr as $key=>$value) {
            $arr[$key] = $s_expend.$value;
        }
    }
    else {
        foreach ($arr as $key=>$value) {
            $arr[$key]  = $value.$s_expend;
        }
    }
    return $arr;
}

/**
 * 一维数组每个value值加上特定的字符-oss
 *
 * @param array  $arr 一维数组
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function oss_arr_value_add_string($arr = [])
{
    foreach ($arr as $key=>$value) {
        $arr[$key] = oss_full_url($value);
    }
    return $arr;
}

/**
 * 一维数组每个value值公共的字符替换成其他的字符
 *
 * @param array  $arr 一维数组
 * @param string $s_expend 公共字符
 * @param string $s_replace 替换字符
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function arr_value_replace_string($arr = [],$s_expend = '',$s_replace = '')
{
    foreach ($arr as $key=>$value) {
        $arr[$key] = str_replace($s_expend,$s_replace,$value) ;
    }
    return $arr;
}

/**
 * 数组重置 - 将键重置成索引的数组
 *
 * @param array $arr
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function arr_reset($arr = [])
{
    $arr_data = [];
    foreach ($arr as $key=>$value) {
        $arr_data[] = $value ;
    }
    return $arr_data;
}

/**
 * 友好返回错误信息
 *
 * @param string $s_msg
 * @param array  $arr_data
 * @param string $s_error
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function hello_error($s_msg = '',$arr_data = [],$s_error = '')
{
    return ['state'=>1,'msg'=>$s_msg,'data'=>$arr_data,'error'=>$s_error];
}

/**
 * 友好返回错误信息
 *
 * @param string $s_msg
 * @param array  $arr_data
 * @param string $s_error
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function hello_warning($s_msg = '',$n_state = 1, $arr_data = [],$s_error = '')
{
    return ['state'=>$n_state,'msg'=>$s_msg,'data'=>$arr_data,'error'=>$s_error];
}
/**
 * 友好返回正确信息
 *
 * @param string $s_msg
 * @param array  $arr_data
 * @param string $s_error
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function hello_success($s_msg = '',$arr_data = [],$s_error = '')
{
    return ['state'=>0,'msg'=>$s_msg,'data'=>$arr_data,'error'=>$s_error];
}

/**
 * 数组形式的链接参数转换成字符串形式
 *
 * @param array $arr_params
 * @param bool  $type true 带? false 不带?
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function param_arr_to_url_str($arr_params = [],$type = true){
    $s_query_params = '';
    foreach ($arr_params as $key=>$value)
    {
        $param = $key.'='.$value;
        if(empty($s_query_params)) {
            $s_query_params = $param;
        }
        else {
            $s_query_params .= '&'.$param;
        }
        if($type){
            $s_query_params = '?'.$s_query_params;
        }
    }
    return $s_query_params;
}

/**
 * 路由全链接-参数路由别名
 *
 * @param string $name
 * @param array  $parameters
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function route_name_url($name = '', $parameters = [])
{
    $oc_route = collect(cache_permission());
    $route_name = '';
    $res = $oc_route->where('id',$name)->first()['route'];
    if(!is_null($res)){
        $route_name = $res;
    }
//    else{
//        $res = $oc_route->where('route',$name)->first()['route'];
//        if(!is_null($res)){
//            $route_name = $res;
//        }
//    }
    $s_query_params = param_arr_to_url_str($parameters);
    return domain_host().$route_name.$s_query_params;
}

/**
 * 主域名 host
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function domain_host(){
    return 'http://'.$_SERVER['HTTP_HOST'].'/';
}


/**
 * 列表查询数据转换成数组形式
 *
 * @param $data
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function list_page_data($data,$arr_search = []){
    $res = $data->toarray();
    $arr_data = [
      'data'=>$res['data'],
      'page_data'=>[
        'current_page'=>$res['current_page'],
        'last_page'=>$res['last_page'],
        'per_page'=>$res['per_page'],
        'total'=>$res['total'],
      ],
      'data_count'=>count($res['data']),
//      'total'=>$res['total'],
      'page_link'=>$data->links(),
      'arr_search'=>$arr_search,
    ];

    return $arr_data;
}

/**
 * 列表查询数据转换成数组形式-for api
 *
 * @param $data
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function list_page_data_for_api($data,$arr_search = []){

    $arr_data = [
      'data_count'=>count($data['data']),
      'page_data'=>[
        'current_page'=>$data['current_page'],
        'last_page'=>$data['last_page'],
        'per_page'=>$data['per_page'],
        'total'=>$data['total'],
      ],
      'data'=>$data['data'],
//      'arr_search'=>$arr_search,
    ];
    return $arr_data;
}

function articl_random_str () {
    $poems="
    从善如登，从恶如崩。 
已知花意，未见其花，已见其花，未闻花名 
如果能不长大就好了啊 可是时光在身后挡住退路。 
或许前路永夜，即便如此我也要前进，
因为星光即使微弱也会为我照亮前路 
你驻足于春色中，于那独一无二的春色之中
喜欢的人喜欢别人不是很正常吗。
生活是不公平的；要去适应它。——比尔盖茨
人生就是一列开往坟墓的列车，路途上会有很多站，
很难有人可以自始至终陪着走完。当陪你的人要下车时，
即使不舍也该心存感激，然后挥手道别。
往者不可谏，来着犹可追。——《论语·微子》
多行不义必自毙。——《左传》
敏而好学，不耻下问。——《论语·公冶长》
避其锐气，击其惰归。——《孙子兵法·军争》
十年树木，百年树人。——《管子·权修》
居安思危，思则有备，有备无患。——《左传》
天时不如地利，地利不如人和。——《孟子·公孙丑》
人谁无过？过而能改，善莫大焉。——《论语》
信言不美，美言不信。——老子
满招损，谦受益。——《尚书·大禹谟》
高岸为谷，深谷为陵。——《诗经·小雅》
天作孽，犹可违，自作孽，不可活。——《尚书》
言之无文，行而不远。——《左传》
三军可夺帅也，匹夫不可夺志也。——《论语·子罕》
天行健，君子以自强不息。——《周易·乾·象》
皮之不存，毛将焉附。——《左传》
路漫漫其修远兮，吾将上下而求索。——屈原《离骚》
长太息以掩涕兮，哀民生之多艰。——屈原《离骚》
人而无仪，不死何为。——《诗经·鄘风》
捐躯赴国难，视死忽如归。——曹植《白马篇》
天下之事常成于困约，而败于奢靡。——陆游
知之者不如好之者，好之者不如乐之者。——《论语·雍也》
志当存高远。——诸葛亮《诫外生书》
不去庆父，鲁难未已。——《左传》
老吾老，以及人之老；幼吾幼，以及人之幼。——《孟子·梁惠王下》
博学之，审问之，慎思之，明辨之，笃行之。——《中庸》
人非圣贤，孰能无过。——《训俗遗规》
亦余心之所善兮，虽九死其犹未悔。——《屈原·离骚》
若要功夫深，铁杵磨成针。——曹学《蜀中广记·上川南道彭山县》
少壮不努力，老大徒悲伤。——汉乐府古辞《长歌行》
穷则独善其身，达则兼济天下。——《孟子·尽心上》
仁者见仁，智者见智。——《易经·系辞上》
青，取之于蓝而青于蓝；冰，水为之而寒于水。——《荀子·劝学》
千羊之皮，不如一狐之腋。——《史记》
余将董道而不豫兮，固将重昏而终身。——《屈原·涉江》
高山仰止，景行行止。——《诗经·小雅·车辖》
锲而舍之，朽木不折；锲而不舍，金石可镂。——《荀子·劝学》
不傲才以骄人，不以宠而作威。——诸葛亮
尺有所短；寸有所长。物有所不足；智有所不明。——屈原《卜居》
言必信，行必果。——《论语·子路》
有志者事竟成。——《后汉书·耿列传》
其身正，不令而行；其身不正，虽令不从。——论语·子路
三人行，必有我师焉：择其善而从之，其不善者而改之。——《论语·述而》
非学无以广才，非志无以成学。——《三国·诸葛亮·诫子书》
绳锯木断，水滴石穿。——罗大经《鹤林玉露》
君子坦荡荡，小人长戚戚。——孔子
老当益壮，宁知白首之心；穷且益坚，不坠青云之志。——王勃
尺有所短，寸有所长。——《史记》
他山之石，可以攻玉。——《诗经·小雅·鹤鸣》
苟余心之端直兮，虽僻远其何伤？——《屈原·涉江》
人有不为也，而后可以有为。——《孟子·离娄下》
路漫漫其修远今，吾将上下而求索。——屈原
孔子登东山而小鲁，登泰山而小天下。——《孟子·尽心上》
积土而为山，积水而为海。——《荀子·儒效》
生于忧患，死于安乐。——《孟子·告子下》
知足不辱，知止不殆。——老子
桃李不言，下自成蹊。——《史记》
傲不可长，欲不可纵，乐不可极，志不可满。——魏徵
既来之，则安之。——《论语·季氏》
知己知彼，百战不殆。——《孙子兵法·谋攻》
真者，精诚之至也，不精不诚，不能动人。——《庄子·渔夫》
独学而无友，则孤陋而寡闻。——《礼记·杂记》
勿以恶小而为之，勿以善小而不为。惟贤惟德，能服于人。——刘备";
    $poems=explode("\n",$poems);
    return $poems[rand(0,count($poems)-1)];
}

/**
 * 从一篇文章中随机取一段话
 *
 * @return mixed
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function articl_random_says(){
    $says=articl_random_str();
    return $says;
}



/**
 * 事务开始
 *
 * @throws \Exception
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function shiwu_start()
{
    \Illuminate\Support\Facades\DB::beginTransaction();
}

/**
 * 事务结束
 *
 * @param $res
 *
 * @throws \Exception
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function shiwu_end($res)
{
    if($res['state'] != 0) {
        \Illuminate\Support\Facades\DB::rollBack();
    }
    else {
        \Illuminate\Support\Facades\DB::commit();
    }
}

function  upload_single_file($file,$file_dir = 'file',$type = 'oss'){
    return upload_one_file($file,['project'=>'xinda']);
}

/**
 * 二进制流上传单个文件
 *
 * @param        $file
 * @param string $file_dir
 * @param string $type
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function  upload_single_file_by_binarystream($file,$file_dir = 'file',$type = 'oss'){
    return upload_one_file($file,['project'=>'xinda']);
}

/**
 * 上传文件
 *
 * @param $file
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function  upload_one_file($file,$arr_option = []){
    if(empty($arr_option['file_dir'])){
        $file_dir = 'file';
    }
    else{
        $file_dir = trim($arr_option['file_dir']);
    }
    if(empty($arr_option['upload_type'])){
        $type = 'oss';
    }
    else{
        $type = trim($arr_option['upload_type']);
    }
    if(empty($arr_option['project'])){
        $s_project = 'xinda';
    }
    else{
        $s_project = trim($arr_option['project']);
    }
    if(empty($arr_option['size'])){
        $n_size = 10;
    }
    else{
        $n_size = intval($arr_option['size']);
    }

    if (!empty($file)) {
        $file_size = $file['size'];// 10758
        $file_name = $file['name'];
        $file_error = $file['error'];//0
        $file_error_msg = 'unknow';// The file "a8.jpg" was not uploaded due to an unknown error.
        $tmppath = $file['tmp_name'];//获取上传图片的临时地址
        $s_type = $file['type'];//文件类型
        if($file_error > 0) {
            return hello_error($file_error_msg);
        }
        elseif($file_size > 1024 * 1024 * $n_size) {
            return hello_error('上传文件不能大于'.$n_size.'MB');
        }
        else {
            $s_file_extension = 'unknow';
            if(!empty($file_name)){
                $arr_file_extension = explode('.',$file_name);
                $s_file_extension = end($arr_file_extension);
            }
//            if(empty($file['type'])){
//                $arr_file_extension = explode('.',$file_name);
//            }
//            else {
//                $arr_file_extension = explode('/',$s_type);
//            }

            //生成文件名
            $fileName = date('ymdhis').'_'.uniqid(). '.' . $s_file_extension;

            //拼接上传的文件夹路径(按照日期格式1810/17/xxxx.jpg)
            $pathName = $s_project.'/'.$file_dir.'/'.date('Y-m/d').'/'.$fileName;
        }

        //上传图片到阿里云OSS
        return upload_file_to_oss($pathName,$tmppath,['ContentType' => $file['type']]);
    } else {
        return hello_error('没有文件被上传');
    }
}

/**
 * 上传文件到oss
 *
 * @param $pathName
 * @param $tmppath
 * @param $arr_option
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function upload_file_to_oss($pathName,$tmppath,$arr_option){
    //上传图片到阿里云OSS
    \HiCommon\Service\Oss::upload($pathName,$tmppath,$arr_option);

    //获取上传图片的Url链接
    $oss_url = \HiCommon\Service\Oss::getUrl($pathName);
    if($oss_url) {

        //oss文件添加历史
        oss_file_add_history($pathName);

        $arr_data = ['src' => $pathName,'url'=>$oss_url];
        return  hello_success('文件上传成功',$arr_data);
    }
    else {
        return hello_error('文件上传失败');
    }
}

/**
 * base64上传单个文件
 *
 * @param string $base64_str
 * @param string $file_dir
 * @param string $type
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function  upload_single_file_by_base64($base64_str = '',$file_dir = 'file',$type = 'oss'){
    if (!empty($base64_str)) {
        $file = base64_to_arr($base64_str);
        $file_size = $file['size'];// 10758
        $file_ext = $file['ext'];// png
        $s_file = $file['file'];// base64图片
        $s_content_type = $file['content_type'];// ContentType image/png
        if($file_size > 1024*1024*10) {
            return ['state'=>1,'msg'=>'上传文件不能大于10MB','data'=>[],'error'=>''];
        }
        else {
            //生成文件名 + 拼接上传的文件夹路径(按照日期格式1810/17/xxxx.jpg)
            $file_name = date('ymdhis').'_'.uniqid(). '.' . $file_ext;
            $path_name = 'xinda/'.$file_dir.'/'.date('Y-m/d').'/'.$file_name;
        }
        $file_name = 'tmp/'.$file_name;
        file_put_contents($file_name,base64_decode($s_file));

        //上传图片到阿里云OSS + 获取上传图片的Url链接
        $res = upload_file_to_oss($path_name,$file_name,['ContentType' => $s_content_type]);

        if($res['state'] == 0) {
            unlink($file_name);
        }
        return $res;


    } else {
        return ['state'=>1,'msg'=>'没有文件被上传','data'=>[],'error'=>''];
    }
}

/**
 * 二进制流上传多个文件
 *
 * @param        $file
 * @param string $file_dir
 * @param string $type
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function  upload_multiple_files_by_base64($file,$file_dir = 'file',$type = 'oss'){
    if(count($file) <= 0){
        return hello_error('没有文件被上传');
    }
    else{
        $arr_data = [];
        foreach ($file as $value)
        {
            $res = upload_single_file_by_base64($value,$file_dir,$type);
            if($res['state'] != 0){
                return hello_error($res['msg']);
            }
            $arr_data[] = [
              'src'=>$res['data']['src'],
              'url'=>$res['data']['url'],
            ];
        }

        return  hello_success('成功',$arr_data);
    }

}

function get_file_by_url($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    $file = curl_exec($ch);
    return $file;
}

/**
 * 根据图片url链接上传文件
 *
 * @param string $base64_str
 * @param string $file_dir
 * @param string $type
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function  upload_wxavator_by_url($img_url = '',$file_dir = 'wx'){
    $file_ext = 'png';// png
    $s_content_type = 'image/png';// ContentType image/png
    //生成文件名 + 拼接上传的文件夹路径(按照日期格式1810/17/xxxx.jpg)
    $file_name = date('ymdhis').'_'.uniqid(). '.'.$file_ext;
    $path_name = 'xinda/'.$file_dir.'/'.date('Y-m/d').'/'.$file_name;
    $tmp_file_name = 'tmp/'.$file_name;
    $file = get_file_by_url($img_url);
    file_put_contents($tmp_file_name,$file);

    //上传图片到阿里云OSS + 获取上传图片的Url链接
    $res = upload_file_to_oss($path_name,$tmp_file_name,['ContentType' => $s_content_type]);

    if($res['state'] == 0) {
        unlink($tmp_file_name);
    }
    return $res;
}

/**
 * oss文件添加历史
 *
 * @param string $s_file_name
 *
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function oss_file_add_history($s_file_name = ''){
    $arr_data = ['file_name'=>$s_file_name,'is_delete'=>0,'is_use'=>0];
    \HiCommon\MongodbModel\MongoOssFileUploadHistory::create($arr_data);
}

/**
 * oss文件使用历史
 *
 * @param string $s_file_name
 *
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function oss_file_use_history($s_file_name = ''){
    $arr_where = ['file_name'=>$s_file_name];
    $arr_data = ['is_delete'=>0,'is_use'=>1];
    \HiCommon\MongodbModel\MongoOssFileUploadHistory::where($arr_where)->update($arr_data);
}

/**
 * oss文件删除历史
 *
 * @param string $s_file_name
 *
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function oss_file_delete_history($s_file_name = ''){
    $arr_where = ['file_name'=>$s_file_name];
    $arr_data = ['is_delete'=>1,'is_use'=>0];
    \HiCommon\MongodbModel\MongoOssFileUploadHistory::where($arr_where)->update($arr_data);
}

/**
 * base64数据转换成数组
 *
 * @param $s_base64_file
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function base64_to_arr($s_base64_file){
    $arr_base64_file = explode('base64,', $s_base64_file);
    $arr_base64_file_type = explode(':', $arr_base64_file[0]);
    $s_base64_file_type = rtrim($arr_base64_file_type[1],';');
    $s_file_type =  explode('/', $s_base64_file_type)[1];
    $s_file = $arr_base64_file[1];
    $img_len = strlen($s_file);
    $file_size = $img_len - ($img_len / 8) * 2;
    $arr_data = [
      'content_type'=>$s_base64_file_type,
      'ext'=>$s_file_type,
      'file'=>$s_file,
      'size'=>$file_size,
    ];
    return $arr_data;
}

/**
 * 获取客户端IP地址
 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
 * @param boolean $adv 是否进行高级模式获取（有可能被伪装）
 * @return mixed
 */
function get_client_ip($type = 0,$adv=false) {
    $type       =  $type ? 1 : 0;
    static $ip  =   NULL;
    if ($ip !== NULL) return $ip[$type];
    if($adv){
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            $pos    =   array_search('unknown',$arr);
            if(false !== $pos) unset($arr[$pos]);
            $ip     =   trim($arr[0]);
        }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ip     =   $_SERVER['HTTP_CLIENT_IP'];
        }elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip     =   $_SERVER['REMOTE_ADDR'];
        }
    }elseif (isset($_SERVER['REMOTE_ADDR'])) {
        $ip     =   $_SERVER['REMOTE_ADDR'];
    }
    // IP地址合法验证
    $long = sprintf("%u",ip2long($ip));
    $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
    return $ip[$type];
}

////////////////////////// 其他 模块 end




////////////////////////// 时间处理 模块 start

/**
 * 友好的时间显示 输入时间戳
 *
 * @param int    $n_time 待显示的时间
 * @param string $type  类型. normal | mohu | full | ymd | other
 * @return string
 */
function friendly_date($n_time, $type = '')
{
    if (!$n_time) {
        return '';
    }
    //sTime=源时间，cTime=当前时间，dTime=时间差

    $c_time = time();
    $d_time = $c_time - $n_time;
    //如果时间在同一年内计算可以  如果跨年了 时间计算就有问题
    //$d_day       =    intval(date("z",$c_time)) - intval(date("z",$n_time));
    $d_day = intval($d_time / 3600 / 24);
    $d_year = intval(date("Y", $c_time)) - intval(date("Y", $n_time));
    //normal：n秒前，n分钟前，n小时前，日期
    if ($type == 'normal') {
        if ($d_time < 60) {
            if ($d_time < 10) {
                return '刚刚';    //by yangjs
            } else {
                return intval(floor($d_time / 10) * 10) . "秒前";
            }
        } elseif ($d_time < 3600) {
            return intval($d_time / 60) . "分钟前";
            //今天的数据.年份相同.日期相同.
        } elseif ($d_year == 0 && $d_day == 0) {
            //return intval($d_time/3600)."小时前";
            return '今天' . date('H:i', $n_time);
        } elseif ($d_year == 0) {
            return date("m月d日 H:i", $n_time);
        } else {
            return date("Y-m-d H:i", $n_time);
        }
    } elseif ($type == 'mohu') {

        if ($d_time < 60) {
            return $d_time . "秒前";
        } elseif ($d_time < 3600) {
            return intval($d_time / 60) . "分钟前";
        } elseif ($d_time >= 3600 && $d_day == 0) {
            return intval($d_time / 3600) . "小时前";
        } elseif ($d_day > 0 && $d_day <= 7) {
            return intval($d_day) . "天前";
        } elseif ($d_day > 7 && $d_day <= 30) {
            return intval($d_day / 7) . '周前';
        } elseif ($d_day > 30) {
            return intval($d_day / 30) . '个月前';
        }
    } elseif ($type == 'full') {
        return date("Y-m-d , H:i:s", $n_time);
    } elseif ($type == 'ymd') {
        return date("Y-m-d", $n_time);
    } else {
        if ($d_time < 60) {
            return $d_time . " 秒前";
        } elseif ($d_time < 3600) {
            return intval($d_time / 60) . " 分钟前";
        } elseif ($d_time >= 3600 && $d_day == 0) {
            return intval($d_time / 3600) . " 小时前";
        } elseif ($d_year == 0) {
            return date("Y-m-d H:i:s", $n_time);
        } else {
            return date("Y-m-d H:i:s", $n_time);
        }
    }
}

/**
 * 友好的时间显示 输入时间日期格式
 *
 * @param int    $s_time 待显示的时间
 * @param string $type  类型. normal | mohu | full | ymd | other
 * @return string
 */
function ymd_friendly_date($s_time,$type = 'mohu') {
    if (!$s_time) {
        return '';
    }
    $n_time = strtotime($s_time);
   return friendly_date($n_time,$type);
}

/**
 * 时间戳 转换成 年月日时分秒
 *
 * @param string $n_time
 *
 * @return false|string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function time_to_ymdhis($n_time = ''){
    if(empty($n_time)) {
        $n_time = time();
    }
    return date('Y-m-d H:i:s',$n_time);

}

////////////////////////// 时间处理 模块 end




////////////////////////// 数字处理 模块 start

/**
 * 小数保留处理
 *
 * 默认四舍五入
 *
 * @param float $n_decimal 小数
 * @param int   $num 保留小数点后的位数
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function decimal_format($n_decimal = 0.01,$num = 0) {
    return sprintf('%.'.$num.'f', $n_decimal);
}



////////////////////////// 数字处理 模块 end


////////////////////////// 返回数据处理 模块 start

/**
 * 返回json响应
 *
 * @param array $data
 * @param int   $status
 * @param array $headers
 * @param int   $options
 *
 * @return \Illuminate\Http\JsonResponse
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function response_json($data = [], $status = 200, $headers = [], $options = 0)
{
    return response()->json($data, $status, $headers, $options);
}

////////////////////////// 返回数据处理 模块 end





////////////////////////// 待扩展 模块 start

/**
 * 填充链接地址
 *
 * @param        $value
 * @param string $s_type
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function full_url($value,$s_type = 'oss')
{
    if(strpos($value, 'https://') !== false) {
        $res = $value;
    }
    elseif(strpos($value, 'http://')!== false)
    {
        $res =  $value;
    }
    elseif(empty($value))
    {
        $res =  '';
    }
    else {
        $res =  oss_host().$value;
    }
    return $res;
}

/**
 * oss 填充链接地址
 *
 * @param        $value
 * @param string $s_type
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function oss_full_url($value)
{

    if(strpos($value, 'https://') !== false) {
        $res = $value;
    }
    elseif(strpos($value, 'http://')!== false)
    {
        $res =  $value;
    }
    elseif(empty($value))
    {
        $res =  '';
    }
    else {
        $res =  oss_host().$value;
    }
    return $res;
}

/**
 * 本地 填充链接地址
 *
 * @param        $value
 * @param string $s_type
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function local_full_url($value)
{
    if(strpos($value, 'https://') !== false) {
        $res = $value;
    }
    elseif(strpos($value, 'http://')!== false)
    {
        $res =  $value;
    }
    elseif(empty($value))
    {
        $res =  '';
    }
    else {
        $res = domain_host().$value;
    }
    return $res;
}

/**
 * 逗号分割的图片链接字符串处理成 特定格式的 数组
 *
 * @param $s_img
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function imgurl_string_to_format_array($s_img)
{
    $n_img_count = 0;
    $s_img_default = '';
    $arr_img_data_list = [];
    $arr_img_base_data_list = [];
    if(!empty($s_img)) {
        $arr_img_base_data_list = explode(',',$s_img);
        $n_img_count = count($arr_img_base_data_list);
        $s_img_default = oss_full_url($arr_img_base_data_list[0]);
        $arr_img_data_list = oss_arr_value_add_string($arr_img_base_data_list);
    }
    $arr_data = [
      'count'=>$n_img_count,
      'default'=>$s_img_default,
      'data_list'=>$arr_img_data_list,
      'base_data_list'=>$arr_img_base_data_list,
    ];
    return $arr_data;
}

/**
 * 正则从代码中提取图片
 *
 * @param $text
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function take_imgurl_by_preg($text) {
    $images = [];
    if(preg_match_all('/< *img[^>]*src *= *["\']?([^"\']*)/i', $text, $img)) {
        foreach($img[1] as $key => $val) {
            if($val) {
                $images[] = $val;
            }
        }
    }
    return $images;
}

/**
 * 树形数组转换成一维伪树形数组
 *
 * @param $data
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function tree_to_one_tree($data){
    $arr_data = [];
    if(!empty($data)){
        foreach ($data as $value)
        {
            $arr_child =  $value['_child'];
            if(!empty($arr_child)){
                $value['_child'] = 1;
                $arr_data[] = $value;
                $a = tree_to_one_tree($arr_child);
                $arr_data = array_merge($arr_data,$a);
            }
            else{
                $value['_child'] = 0;
                $arr_data[] = $value;
            }
        }
    }
    return $arr_data;
}

//function get_child_for_one_tree($co_data,$n_pid){
//    $arr_data = [];
//
//    //找子级
//    $res  = $co_data->where('pid',$n_pid)->toArray();
//    if(!empty($res)){
//        foreach ($res as $ka=>$va)
//        {
//            $arr_data[] = $va;
//            $b = get_child_for_one_tree($co_data,$va['id']);
//            $arr_data = array_merge($arr_data,$b);
//
//        }
//    }
//
//    return $arr_data;
//
//}
//function make_one_tree_data($data){
//    $arr_data = [];
//    $co_data = collect($data);
//
//    foreach ($data as $key=>$value)
//    {
//        if($value['pid'] == 0){
//            $value['level'] = 0;
//            $arr_data[] = $value;
//            $arr_data = array_merge($arr_data,get_child_for_one_tree($co_data,$value['id']));
//        }
//    }
//    return $arr_data;
//}

////////////////////////// 待扩展 模块 end



////////////////////////// 仅对本项目公共 模块 start





////////////////////////// 仅对本项目公共 模块 end


/**
 * 随机生成唯一订单号
 *
 * @param string $s_prefix
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function random_order_sn($s_prefix = ''){

    /*方法1 一次性生成100条数据 效果很差*/
//    $str = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);

    /*方法2 一次性生成100条数据 效果不错几乎没有重复 500也还好 1000几乎都会有几条重复数据*/
    $str = date('ymdhis') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);

    /*方法3 同方法2 效果差别不大*/
//    $str = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'][intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));
    return $s_prefix.$str;
}


/**
 * 保留数组内指定key值的几个元素
 *
 * @param $arr
 * @param $arr_remain_key
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function array_remain($arr,$arr_remain_key){
    $arr_data = [];
    foreach ($arr_remain_key as $value)
    {
        if(isset($arr[$value])){
            $arr_data[$value] = $arr[$value];
        }
    }
    return $arr_data;
}

/**
 * 字符串过滤空格
 *
 * @param string $s_str
 *
 * @return string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function str_trim($s_str = ''){
    $s_str = (!isset($s_str)) ? '': trim($s_str);
    return $s_str;
}

/**
 * 过滤数组里的null字段，同时去掉字符串中的空格
 *
 * @param $arr_input
 *
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function filter_input_data(&$arr_input){
    $arr_input = collect($arr_input)
      ->filter(function ($value) {
          if (!is_null($value)) {
              return $value;
          }

      })
      ->map(function ($value) {
          if (is_string($value)) {
              $value = str_trim($value);
          }
          return $value;

      })
      ->toArray();
}

/**
 * 求两个已知经纬度之间的距离
 *
 * @param int $longitude_start  起点经度
 * @param int $latitude_start   起点纬度
 * @param int $longitude_end    终点经度
 * @param int $latitude_end     终点纬度
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function location_distance($longitude_start = 0,$latitude_start = 0,$longitude_end = 0,$latitude_end = 0){

    $R = 6378.137;//地球半径

    //方法1
    $rad_lat_start = deg2rad($latitude_start); //deg2rad()函数将角度转换为弧度
    $rad_lat_end = deg2rad($latitude_end);
    $rad_lon_start = deg2rad($longitude_start);
    $rad_lon_end = deg2rad($longitude_end);
    $x_lat = $rad_lat_start - $rad_lat_end;
    $x_lon = $rad_lon_start - $rad_lon_end;
    $result = 2 * asin(sqrt(pow(sin($x_lat / 2), 2) + cos($rad_lat_start) * cos($rad_lat_end) * pow(sin($x_lon / 2), 2))) * $R;
    $n_mi = number_format($result*1000,0,'','');

    $n_km = number_format($result,2);
    if($n_mi >= 1000){
        $s_default = $n_km.'公里';
        $s_en_default = $n_km.'km';
    }
    else{
        $s_default = $n_mi.'米';
        $s_en_default = $n_mi.'m';
    }
    return ['m'=>$n_mi,'km'=>$n_km,'default'=>$s_default,'en_default'=>$s_en_default];


   /* //方法2
    $lon_x = $longitude_start - $longitude_end;
    $lat_x = $latitude_start - $latitude_end;
    $rad_lon_x = pow(sin(pi()*($lon_x)/360),2);
    $rad_lat_x = pow(sin(pi()*($lat_x)/360),2);
    $rad_lan_s = cos(pi()*$latitude_start/180);
    $rad_lan_e = cos($latitude_end * pi()/180);
    $result = 2 * $R * asin(sqrt($rad_lon_x + $rad_lan_s * $rad_lan_e *$rad_lat_x));
    $n_mi = number_format($result*1000,2);
    $n_km = number_format($result,2);
    return ['m'=>$n_mi,'km'=>$n_km];*/
}

/**
 * 字符时间日期转为日期格式
 *  例如：201909191751626 转为 2019-09-19 17:51:62
 *
 * @param string $s_date
 *
 * @return false|string
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function ymdhis_to_time_date($s_date = ''){
    if(strlen($s_date) < 14){
        $time_ymdhis = date('Y-m-d H:i:s',0);
    }
    else
    {
        $y = substr($s_date,0,4);
        $m = substr($s_date,4,2);
        $d = substr($s_date,6,2);
        $h = substr($s_date,8,2);
        $i = substr($s_date,10,2);
        $s = substr($s_date,12,2);
        $time_ymdhis = $y.'-'.$m.'-'.$d.' '.$h.':'.$i.':'.$s;
    }
    return $time_ymdhis;

}


/**
 * 保存session
 *
 * @param string $key
 * @param string $value
 *
 * @return bool
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function session_set($key = '',$value = ''){
    Session::put($key,$value);
    return Session::save();
}

/**
 * 获取session
 *
 * @param string $key
 *
 * @return mixed
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function session_get($key = ''){
    return Session::get($key);
}

/*生成唯一token*/
function make_unique_token($n_uid = 0,$n_length = 11){
    if($n_uid == 0){
        $n_uid = mt_rand(1,9999999999);
    }
    $n_id = str_pad($n_uid,$n_length,"0",STR_PAD_LEFT);
    $s_unique_token = rtrim(base64_encode(uniqid().'_'.$n_id),'==');
    return $s_unique_token;
}

function str_upper_base64_md5($s_uniqid = '', $header = ''){
    $result = $header.strtoupper(rtrim(base64_encode(md5($s_uniqid)),'=='));
    return $result;
}

/*处理数组变成笛卡尔积*/
function combine_cartesian($data) {
    $result = array();
    foreach (array_shift($data) as $k=>$item) {
        $result[] = array($k=>$item);
    }


    foreach ($data as $k => $v) {
        $result2 = [];
        foreach ($result as $k1=>$item1) {
            foreach ($v as $k2=>$item2) {
                $temp     = $item1;
                $temp[$k2]   = $item2;
                $result2[] = $temp;
            }
        }
        $result = $result2;
    }
    return $result;
}

/**
 * 密码正则验证字符
 *
 * @param $password
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function preg_password($password,$type='simple'){
//    $rule = "/^[\w`~!@#$%^&*()+-=·~！￥……（）——\[\];'\\\,.\/\{\}:\"|<>?【】；’、‘，。：“”《》？]{6,30}$/";//数字、字母、特殊字符
    if($type === 'simple'){
        $rule = '/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,18}$/';//密码必须同时包含数字和字母的6-18位字符组成
        $msg = '密码由6-18位字符组成，必须同时包含数字和字母';
    }
    elseif($type === 'difficult'){
        $rule = '/^[A-Za-z0-9_\-+=*!@#$%^&()]{6,18}$/';//密码由大小写字母数字和指定特殊符号_\-+=*!@#$%^&()的6-18位字符组成
        $msg = '密码由6-18位字符组成，只能是数字、字母或者指定特殊字符_\-+=*!@#$%^&()';
    }
    elseif($type === 'nightmare'){
        $rule = "/^[\w`~!@#$%^&*()+-=·~！￥……（）——\[\];'\\\,.\/\{\}:\"|<>?【】；’、‘，。：“”《》？]{6,18}$/";//数字、字母、特殊字符
        $msg = '密码由6-18位字符组成，只能是数字、字母或特殊字符';
    }
    else{
        $rule = '/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,18}$/';//密码必须同时包含数字和字母的6-18位字符组成
        $msg = '密码由6-18位字符组成，必须同时包含数字和字母';
    }

    $res = preg_match_all($rule,$password,$array);
    if(!$res){
//        return hello_error('密码只能由数字字母以及非空格的特殊字符组成');
        return hello_error($msg);
    }
    return  hello_success('密码正则成功');
}

/**
 * 手机号正则验证字符
 *
 * @param $phone
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function preg_phone($phone){
    $rule = "/^1[3456789]\d{9}$/";
    $res = preg_match_all($rule,$phone,$array);
    if(!$res){
        return hello_error('手机号格式错误');
    }
    return  hello_success('手机号正则成功');
}

////////////////////////// 日期处理函数 模块 start


function get_ctime($month){
    $month_start = strtotime($month) ;//指定年月份月初时间戳
    $BeginDate = date('Y-m-01', $month_start );
    $EndDate = date('Y-m-d 23:59:59', strtotime("$BeginDate +1 month -1 day"));
    $months = date('Y-m-d 0:0:0' , $month_start) .' _ '.$EndDate;
    return $months;
}


/**
 * 获取指定日期段内 指定格式的集合
 *
 * @param array $arr_date
 *
 * string  $arr_date['start'] 开始日期 格式化时间 Y-m-d H:i:s
 * string  $arr_date['end']   结束日期 格式化时间 Y-m-d H:i:s
 * string  $arr_date['date_type']   指定格式 Y 年 Ym 月 Ymd日
 *
 * @return array
 * @throws \Exception
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function get_date_from_range($arr_date = [])
{
    $startdate = $arr_date['start'];
    $enddate = $arr_date['end'];
    if(empty($startdate)){
        return [];
    }
    if(empty($enddate)){
        return [];
    }
    if (strtotime($enddate) < strtotime($startdate)) {
        return [];
    }

    switch ($arr_date['date_type']) {
        //精确到日
        case 'Ymd':
            $date_type = '1 day';//时间间距
            $date_format = 'Y-m-d';//日期格式
            break;

        //精确到月
        case 'Ym':
            $date_type = '1 month';//时间间距
            $date_format = 'Y-m';//日期格式
            break;

        //精确到年
        case 'Y':
            $date_type = '1 year';//时间间距
            $date_format = 'Y';//日期格式
            break;

        //默认精确到日
        default:
            $date_type = '1 day';//时间间距
            $date_format = 'Y-m-d';//日期格式
    }

    $startdate  = date($date_format, strtotime($startdate));
    $enddate    = date($date_format, strtotime($enddate .'+'.$date_type));

    if($arr_date['date_type'] == 'Y'){
        for($i = $startdate;$i < $enddate ;$i++){
            $arr_data[] = strval($i);
        }

    }
    else{
        $start    = new \DateTime($startdate);
        $end      = new \DateTime($enddate);

        // 时间间距 这里设置的是一个月
        $interval = \DateInterval::createFromDateString($date_type);
        $period   = new \DatePeriod($start, $interval, $end);

        $arr_data = [];
        foreach ($period as $dt) {
            $arr_data[] =  $dt->format($date_format);
        }

    }
    $data = [
      'dates' =>$arr_data,
      'days'  => count($arr_data),
    ];
    return $data;
}

/**
 * 格式化日期搜索条件
 *
 * @param $arr_date
 *
 * @return mixed
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function format_date($arr_date){
    $startdate = $arr_date['start'];
    $enddate = $arr_date['end'];
    switch ($arr_date['date_type']) {
        //精确到日
        case 'Ymd':
            $date_type = '1 day';//时间间距
            $date_format = '%Y-%m-%d';//日期格式
            break;

        //精确到月
        case 'Ym':
            $date_type = '1 month';//时间间距
            $date_format = '%Y-%m';//日期格式
            break;

        //精确到年
        case 'Y':
            $date_type = '1 year';//时间间距
            $date_format = '%Y';//日期格式
            break;

        //默认精确到日
        default:
            $date_type = '1 day';//时间间距
            $date_format = '%Y-%m-%d';//日期格式
    }
    $startdate  = date('Y-m-d H:i:s', strtotime($startdate));
    $enddate    = date('Y-m-d H:i:s', strtotime($enddate) + 86400);
    $arr_date_between = [$startdate,$enddate];
    if(empty($startdate)){
        $arr_date_between =  [];
    }
    if(empty($enddate)){
        $arr_date_between =  [];
    }
    if (strtotime($enddate) < strtotime($startdate)) {
        $arr_date_between =  [];
    }

    $arr_date['date_format'] = $date_format;
    $arr_date['date_between'] = $arr_date_between;
    return $arr_date;
}

/**
 * 获取最近的日期 比如近7天 或者 近6个月
 *
 * @param string $type
 *
 * @return mixed
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function nearly_date($type = ''){
    switch ($type)
    {
        case 'week':
            $arr_date = [
              'start'=>date('Y-m-d',strtotime('-6 day')),
              'end'=>date('Y-m-d'),
              'date_type'=>'Ymd'
            ];
            break;
        case 'month':
            $arr_date = [
              'start'=>date('Y-m').'-01',
              'end'=>date('Y-m-d'),
              'date_type'=>'Ymd'
            ];
            break;
        case 'half_year':
            $arr_date = [
              'start'=>date('Y-m',strtotime('-5 month')).'-01',
              'end'=>date('Y-m-d'),
              'date_type'=>'Ym'
            ];
            break;
        default:
            $arr_date = [
              'start'=>date('Y-m-d',strtotime('-6 day')),
              'end'=>date('Y-m-d'),
              'date_type'=>'Ymd'
            ];
    }
//    $result = format_date($arr_date);
    return $arr_date;

}

/**
 * 获取最近的日期 比如近7天 15天 一个月 或者 近6个月
 *
 * @param string $type
 *
 * @return mixed
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function real_nearly_date($type = ''){
    switch ($type)
    {
        case 'week':
            $arr_date = [
              'start'=>date('Y-m-d',strtotime('-6 day')),
              'end'=>date('Y-m-d'),
              'date_type'=>'Ymd'
            ];
            break;
//        case 'half_month':
//            $arr_date = [
//              'start'=>date('Y-m-d',strtotime('-15 day')),
//              'end'=>date('Y-m-d'),
//              'date_type'=>'Ymd'
//            ];
//            break;
        case 'month':
            $arr_date = [
              'start'=>date('Y-m-d',strtotime('-1 month')),
              'end'=>date('Y-m-d'),
              'date_type'=>'Ymd'
            ];
            break;
        case 'half_year':
            $arr_date = [
              'start'=>date('Y-m',strtotime('-5 month')).'-01',
              'end'=>date('Y-m-d'),
              'date_type'=>'Ym'
            ];
            break;
        default:
            $arr_date = [
              'start'=>date('Y-m-d',strtotime('-6 day')),
              'end'=>date('Y-m-d'),
              'date_type'=>'Ymd'
            ];
    }
//    $result = format_date($arr_date);
    return $arr_date;

}


////////////////////////// 日期处理函数 模块 end




////////////////////////// 密码相关函数 模块 start

/**
 * 判断密码安全级别
 *
 * @param $password
 *
 * @return array
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function judge_password_safety($password){
    $score = judge_password_score($password);
    $percent = ($score/10*100).'%';
    if($score <= 3){
        $result = ['safety'=>'弱','notice'=>'太危险了，赶紧设置个安全点的密码！'];
    }
    elseif ($score > 3 && $score <= 6){
        $result = ['safety'=>'中等','notice'=>'还是有点危险，再接再厉！'];
    }
    elseif ($score > 6 && $score <= 8){
        $result = ['safety'=>'强','notice'=>'现在你的密码已经非常安全了，奥利给！'];
    }
    elseif ($score > 8 && $score <= 10){
        $result = ['safety'=>'极好','notice'=>'还有比这更安全的密码吗？你尽管盗，盗走算我输！！！'];
    }
    else{
        $result = ['safety'=>'无','notice'=>'看不懂，赶紧联系超级管理员吧！'];
    }
    $result['score'] = $score;
    $result['percent'] = $percent;
    return $result;

}

/**
 * 密码安全评分
 *
 * @author wumengmeng <wu_mengmeng@foxmail.com>
 */
function judge_password_score($password = '')
{
    $score = 0;
    if(!empty($password)){ //接收的值
        $str = $password;
    } else{
        $str = '';
    }
    if(preg_match("/[0-9]+/",$str))
    {
        $score ++;
    }
    if(preg_match("/[0-9]{2,}/",$str))
    {
        $score ++;
    }
    if(preg_match("/[a-z]+/",$str))
    {
        $score ++;
    }
    if(preg_match("/[a-z]{2,}/",$str))
    {
        $score ++;
    }
    if(preg_match("/[A-Z]+/",$str))
    {
        $score ++;
    }
    if(preg_match("/[A-Z]{2,}/",$str))
    {
        $score ++;
    }
    if(preg_match("/[_\-+=*!@#$%^&()]+/",$str))
    {
        //  /[_|\-|+|=|*|!|@|#|$|%|^|&|(|)]+/
        $score += 2;
    }
    if(preg_match("/[_\-+=*!@#$%^&()]{2,}/",$str))
    {
        //  /[_|\-|+|=|*|!|@|#|$|%|^|&|(|)]{3,}/
        $score ++ ;
    }
    if(strlen($str) >= 10)
    {
        $score ++;
    }
    return $score;
}
////////////////////////// 密码相关函数 模块 end





    /**
     *  添加系统消息
     *  hinq 2019 12 02
     *  $arr_input['pid']                   类型*  1：系统消息  2：活动消息  3：订单消息
     *  $arr_input['type']                  二级类型*    10：【系统消息】积分消费通知
                                                        11：【系统消息】服务商品下单成功
                                                        12：【系统消息】预约订单下单成功
                                                        13：【系统消息】普通商品下单成功（含活动）
                                                        14：【系统消息】保养提醒
                                                        20：【活动消息】活动推送消息通知
                                                        30：【订单消息】发货
                                                        31：【订单消息】退款申请
                                                        32：【订单消息】退款成功
                                                        33：【订单消息】退款失败
                                                        34：【订单消息】签收（用户端签收）
                                                        35：【订单消息】退货完成
                                                        36：【订单消息】成功支付
                                                        37：【订单消息】取消订单

     **/
/**
 *   添加系统消息和极光推送
 *   $img               string  图片地址
 *   $title             string  标题
 *   $content           string  内容
 *   $user_id           int     用户id
 *   $pid               int     消息类型  1：系统消息  2：活动消息  3：订单消息
 *   $order_id          int     用户id
 *   $extras            array   极光推送的扩展字段
 *   $message_extras    array   消息列表扩展字段
 *  $message_extras['order_type']  int  1:普通订单  2：服务订单3：预约订单  4：道路救援订单  5：保养订单  6：积分订单
 **/
function add_message( string $img=null , string $title = null , string $content = null , int $user_id = 0 ,  int $pid = 3 , int $order_id = 0 ,  array $extras = [] , array $message_extras = [] ){

    if( !isset( $extras['pid'] ) ){
        $extras['pid'] = $pid;
    }
    $arr_jpush = [
        'title' => $title,
        'content' => $content,
        'user_id' => $user_id,
        'extras' => $extras,
    ];

    \HiCommon\Service\JpushService::pushNotifyToone( $arr_jpush );
    $message_data = [
        'img' => $img,
        'title' => $title,
        'content' => $content,
        'pid' => $pid,
        'order_id' => $order_id,
        'user_id' => $user_id,
        'push_time' => time_to_ymdhis(),
        'is_read' => 0
    ];
    $arr_message = array_merge( $message_data ,$message_extras );
    return HiCommon\Repository\LogRepository::message_add( (array) $arr_message );
}


/**
 * 消息推送传数组形式
 *
 * @param array $m
 * @return mixed
 */
function push_message($m = [])
{
    $d = [
        'img' => $m['img'] ?? '',           //图片地址  string
        'title' => $m['title'],             //标题  string
        'content' => $m['content'],         //内容  string
        'user_id' => $m['user_id'],         //用户id   int
        'pid' => $m['pid'],                 //消息类型  1：系统消息  2：活动消息  3：订单消息  int
        'order_id' => $m['order_id'],       //订单id  int
        'j_extend' => $m['j_extend'] ?? [], //极光推送的扩展字段  array
        'm_extend' => $m['m_extend'] ?? []  //消息列表扩展字段    array
    ];
    return add_message($d['img'], $d['title'], $d['content'], $d['user_id'], $d['pid'], $d['order_id'], $d['j_extend'], $d['m_extend']);
}





    //消息模板
    function message_countent_template( array $arr_input = []){
        $integral_all = 0;
        if( $arr_input['pid']== 1 && $arr_input['type'] == 10 ){   //系统消息=>积分兑换
            //获取当前用户的账户积分余额
            $arr_option['field'] = ['integral_all'];
            $user_info = \HiCommon\Repository\UsersRepository::get_one((int) $arr_input['user_id'] ,$arr_option );
            if( !empty( $user_info ->first() ) ) {
                $integral_all = $user_info->integral_all;
            }
        }
        $data = [
            //积分兑换
            110=> [
                'title' => '系统消息',
                'content' => '您刚兑换了'.$arr_input['goods']['name'].'商品，消费了'.$arr_input['goods']['price'].'积分，最新积分余额：'.$integral_all
            ],
            //服务商品
            111=> [
                    'title' => '系统消息',
                    'content' => '您刚购买了'.$arr_input['goods']['name'].'商品，消费￥'.$arr_input['goods']['price'].'元'
                ],
            //同上 预约订单
            112=> [
                    'title' => '系统消息',
                    'content' => '预约的订单'
                ],
            //同上  普通订单（含活动）
            113=> [
                    'title' => '系统消息',
                    'content' => '您刚购买了'.$arr_input['goods']['name'].'商品，消费￥'.$arr_input['goods']['price'].'元'
                ],
            //车辆保养
            114=> [
                    'title' => $arr_input['car']['name'],
                    'content' =>$arr_input['car']['time'].'截止您的车辆即将到达检车日，请于截止日之前完成检车'
                ],
            //活动推送
            220=> [
                    'title' => $arr_input['msg'],
                    'content' => '',
                ],
            //订单发货
            330=> [
                'title' => '发货啦',
                'content' => '您购买的'.$arr_input['title'].'商家已经为您安排发货了',
            ],
            //同上  退货申请
            331=> [
                'title' => '退货申请',
                'content' => '您购买的'.$arr_input['title'].'商品正常申请退货，请及时关注审核结果',
            ],
            //同上   退款成功
            332=> [
                'title' => '已退款',
                'content' => '您购买的'.$arr_input['title'].'已做退款处理，请查看你的账户月变动',
            ],
            //同上   退款失败
            333=> [
                'title' => '退货失败',
                'content' => '您购买的'.$arr_input['title'].'商品退货失败',
            ],
            //快递签收
            334=> [
                'title' => '已签收',
                'content' => '您购买的'.$arr_input['title'].'商品已由'.$arr_input['msg'].'代签，请凭取件码来领取',
            ],'【订单消息】签收（用户端签收）',

            //同上上  退货完成
            335=> [
                'title' => '退货完成',
                'content' => '您购买的'.$arr_input['title'].'商品已完成退货',
            ],
        ];
        return $data[$arr_input['pid'].$arr_input['type']];
    }


/**
 * 远程文件下载
 * @param $url
 * @param string $absolute_path
 */
function download($url, $absolute_path = '')
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    $file = curl_exec($ch);
    curl_close($ch);
    $resource = file_put_contents($absolute_path, $file);
//    fwrite($resource, $file);
//    fclose($resource);
}



/**
 * @todo敏感词过滤，返回结果
 * @paramarray $list 定义敏感词一维数组
 * @paramstring $string 要过滤的内容
 * @returnstring $log 处理结果
 */

function sensitive( $string)
{
//    $sensitivity = \Redis::get('sensitivity');
//    $list = explode('*' , $sensitivity );
    $list = [];
    //获取后台配置的敏感词库
    $where = ['status'=>1,'type'=>1];
    $arr_option['field'] = ['content'];
    $arr_list = \HiCommon\Repository\SensitivityRepository::get_one_where( (array) $where , (array) $arr_option );
    if( empty( $arr_list->first() ) ){  //没有设置敏感词  直接返回
        return false;
    }
    $arr_list = $arr_list->toarray()['content'];
    $list = explode('*' , $arr_list );

    $string = htmlentities( $string, ENT_COMPAT);   //放在js注入
    $string = preg_replace('# #', '', $string);  //删除字符串中的空格
    $pattern = "/" . implode("|", $list) . "/i"; //定义正则表达式a
    if (preg_match_all($pattern, $string, $matches)) { //匹配到了结果
        $patternList = $matches[0]; //匹配到的数组
        $count = count($patternList);
        $sensitiveWord = implode(',', $patternList); //敏感词数组转字符串
        $replaceArray = array_combine($patternList, array_fill(0, count($patternList), '*')); //把匹配到的数组进行合并，替换使用
        $stringAfter = strtr($string, $replaceArray); //结果替换
    }
//    $log = "原句为 [ {$string} ]";
    if ($count == 0) {
        return false;
//        $log .= "暂未匹配到敏感词！";
    } else {
        return true;
//        $log .= "匹配到 [ {$count} ]个敏感词：[ {$sensitiveWord} ]" . "替换后为：[ {$stringAfter} ]";
    }
//    return $log;
}


/**
 *  设置默认协议内容
 *  hinq 2020 6 20
 **/
function defaule_Protocol_list( $type, $title ){
    return [
        'type' => $type,
        'title' => $title,
        'content' => "<p>该协议平台尚未添加</p>",
    ];
}

/*短信数量重置*/
function duanxin_num_reset($n_num = 300){
    predis_hash_set('xinda','duanxin_remain_num',$n_num);

}

/*短信充值*/
function duanxin_num_recharge($n_num = 0){
    return predis_hash_key_increment('xinda','duanxin_remain_num',$n_num);
}

/*短信扣除*/
function duanxin_num_deduct($n_num = 1){
    return predis_hash_key_decrement('xinda','duanxin_remain_num',$n_num);
}

/*短信剩余数量*/
function duanxin_num_get(){

    $result = predis_hash_get('xinda','duanxin_remain_num');
    return $result;
}


